#ifndef FIBHEAP_H
#define FIBHEAP_H

#include <iostream>


using namespace std;

#define DHn 10  //节点可能的最大度数

typedef struct FibHeap_Node
{
    int degree;
    int key;
    FibHeap_Node *p;
    FibHeap_Node *child;
    FibHeap_Node *right;
    FibHeap_Node *left;
    bool mark;
} FibHeap_Node;

extern FibHeap_Node node_array[1001];

class FibHeap
{
private:
    void insert_into_rootlist(FibHeap_Node* x);
    void remove_from_rootlist(FibHeap_Node *x);
    void CONSOLIDATE(void);
    void LINK(FibHeap_Node* y, FibHeap_Node* x);
    void CUT(FibHeap_Node* x, FibHeap_Node* y);
    void CASCADING_CUT(FibHeap_Node* y);
    
public:
    FibHeap_Node* min;
    int n;

    FibHeap();
    int INSERT(int key);
    int EXTRACT_MIN(void);
    int DECREASE_KEY(int l, int k);
    int DELETE(int x);
    int MINIMUN(void);
};

FibHeap UNION(FibHeap H1, FibHeap H2);

#endif